package com.sfac.springboot.config;

import com.sfac.springboot.interceptor.ViewMappingInterceptor;
import org.apache.catalina.connector.Connector;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.ResourceUtils;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @Description WebMvcConfig
 * @Author JiangHu
 * @Date 2022/8/17 10:22
 */
@Configuration
@AutoConfigureAfter({WebMvcAutoConfiguration.class})
public class WebMvcConfig implements WebMvcConfigurer {

	@Value("${server.http.port}")
	private int httpPort;
	@Autowired
	private ResourceConfigBean resourceConfigBean;
	@Autowired
	private ViewMappingInterceptor vMInterceptor;

	@Bean
	public Connector connector() {
		Connector connector = new Connector();
		connector.setPort(httpPort);
		connector.setScheme("http");
		return connector;
	}

	@Bean
	public ServletWebServerFactory servletWebServerFactory() {
		TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
		factory.addAdditionalTomcatConnectors(connector());
		return factory;
	}

	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		String osName = System.getProperty("os.name");
		if (osName.toLowerCase().startsWith("win")) {
			// 将本地文件夹（D:\static）映射给系统一个路径（/static）
			registry.addResourceHandler(resourceConfigBean.getResourcePathPattern())
					.addResourceLocations(ResourceUtils.FILE_URL_PREFIX +
							resourceConfigBean.getLocalPathForWin());
		} else {
			registry.addResourceHandler(resourceConfigBean.getResourcePathPattern())
					.addResourceLocations(ResourceUtils.FILE_URL_PREFIX +
							resourceConfigBean.getLocalPathForLin());
		}
	}

	@Override
	public void addCorsMappings(CorsRegistry registry) {
		registry.addMapping("/**")
				.allowedOrigins("*")
				.allowedOriginPatterns("*")
				.allowedMethods("*")
				.maxAge(3600);
	}

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(vMInterceptor).addPathPatterns("/**");
	}
}
